package com.blackhorse.anlis.anli.config;

import org.apache.commons.dbutils.QueryRunner;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;

/**
 * 使用纯注解配置spring ioc实现单表查询的小案例
 * 该类是一个配置类，用代替applicationContext.xml
 * 或applicationContext_annotation.xml
 *
 * @Configuration 作用：指定一个类为配置类，相当于xml配置文件
 * 注意：
 * 1)当AnnotationConfigApplicationContext构造时传入该类的class对象时，该注解可以不写
 * 2)当需要用@ComponentScan让Spring扫描某个配置类下的注解(@Bean)时，需要加上该注解。
 *
 * @ComponentScan 作用:告知spring扫描的包
 * 属性： value 扫描包的基路径，可以指定多个
 * basePackages 同value的作用一样，用哪一个都可以
 *
 * @Bean 作用：将方法返回的bean对象放入Spring容器
 * 属性： name 用于指定bean的id，如果不写，默认值为当前方法名称
 * 如果方法有参数，spring会去容器中查找有没有可用的bean对象，相当于@Autowried
 *
 * @Import 作用：用于在主配置类中导入其他的配置类
 * 属性：value 指定其他子配置类的字节码，可以指定多个。
 * 在AnnotationConfigApplicationContext构造时只需要传入主配置类字节码
 *
 * @PropertySource 用于指定properties的位置
 * @PropertySources
 *属性： value 指定文件的位置和名称
 *      关键字classpath:... 指定类路径下
 */
@Configuration
@Import(JdbcConfig.class)//导入其他子配置类
@ComponentScan(basePackages = {"com.blackhorse.anlis.anli"})
@PropertySource("classpath:anlis/jdbcConfig.properties")//加载properties文件
public class SpringConfiguration {//每个方法相当于一个<bean>标签

    //方法的参数为依赖属性，返回值为放入spring容器的bean的对象
    @Bean(name = "queryRunner")
    @Scope("prototype")
    public QueryRunner createQueryRunner(DataSource c3p0DataSource) {
        QueryRunner queryRunner = new QueryRunner(c3p0DataSource);
        return queryRunner;
    }

    //已移动到JdbcConfig子配置类中
//    @Bean(name = "c3p0DataSource")
//    public DataSource createDataSource() {
//        ComboPooledDataSource ds = new ComboPooledDataSource();
//        try {
//            ds.setDriverClass("com.mysql.jdbc.Driver");
//            ds.setJdbcUrl("jdbc:mysql://localhost:3306/spring");
//            ds.setUser("root");
//            ds.setPassword("root");
//            return ds;
//        } catch (PropertyVetoException e) {
//            throw new RuntimeException(e);
//        }
//    }
}
